// 两个角色：观察者和被观察者
// 被观察者：Subject
// 观察者：Observer
// 观察者模式：当被观察者状态发生变化时，所有依赖于它的观察者都会收到通知并自动更新。
class Subject {
  private observers: Observer[] = []
  addObserver(obs: Observer) {
    if (this.observers.includes(obs)) return // 防止重复添加
    this.observers.push(obs)
  }
  removeObserver(obs: Observer) {
    this.observers = this.observers.filter(o => o !== obs)
  }
  notifyObservers() {
    this.observers.forEach(obs => obs.update())
  }
  clearAll() {
    this.observers = []
  }
}
class Observer {
  constructor(public name: string) {}
  update() {
    console.log(this.name + 'updated')
  }
}

// 使用示例
const subject = new Subject()
const observer1 = new Observer('张三')
const observer2 = new Observer('李四')
subject.addObserver(observer1)
subject.addObserver(observer2)
console.log('------- 通知观察者 -------')
subject.notifyObservers() // 输出：Observer updated (两次，因为有两个观察者)
subject.removeObserver(observer1)
console.log('------- 通知观察者 -------')
subject.notifyObservers() // 输出：Observer updated (一次，因为只剩下一个观察者)
subject.clearAll() // 清除所有观察者
console.log('------- 通知观察者 -------')
subject.notifyObservers() // 无输出，因为所有观察者已被清除
export { Subject, Observer }